PythonパッケージマネージャPoetryのinstall時に「KeyError」が発生する場合の対処法
はじめに
CX事業本部の吉川です。
案件でPythonを使っており、パッケージマネージャにPoetryを採用したのですが、GitHub Actions上でエラーが発生しちょっと躓いたため共有します。
環境
- GitHub Actions
runs-on: ubuntu-latest
- Python 3.8.x
- Poetry 1.1.4
エラー発生したGithub Actions Workflowファイルの内容
# .github/workflows/build-workflow.yml - name: install dependencies run: | poetry install
このような感じでした。
エラーメッセージ
GitHub Actionsが回ると下記エラーが発生しました。
KeyError 'VIRTUAL_ENV' at /opt/hostedtoolcache/Python/3.8.6/x64/python3.8/os.py:675 in __getitem__ 677│ try: 678│ value = self._data[self.encodekey(key)] 679│ except KeyError: 680│ # raise KeyError with the original key value → 681│ raise KeyError(key) from None 682│ return self.decodevalue(value) 683│ 684│ def __setitem__(self, key, value): 685│ key = self.encodekey(key)
ちょっと悩まされたのは、このエラーの再現は100%ではなく稀に発生するようで、発生してもRerunするだけで解決してしまう点でした。
(おそらく) 解決法
これは既知の問題のようで、GitHubにissueが上がっていました。
https://github.com/python-poetry/poetry/issues/3199
こちらに付いているコメントによると、
poetry config experimental.new-installer false
を実行すると良いようです。
修正後のGitHub Workflowファイルは次のようになります。
# .github/workflows/build-workflow.yml - name: install dependencies run: | poetry config experimental.new-installer false # 追加 poetry install
いかんせん再現が100%ではない問題なのですぐに解決したと判断することはできないのですが、今のところは再発していません。
この設定でしばらく様子を見たいと思います。
experimental.new-installerとは
https://python-poetry.org/blog/announcing-poetry-1-1-0.html
Poetryは1.1.0から並列インストールをサポートする新インストーラを採用したようです。
ただし、「まだexperimentalだから問題があったらissueで報告してね。そのせいで作業できない場合は poetry config experimental.new-installer false
でオフにできるよ」のように言っています。
本記事ではオフにする対応を採ったということでした。
おわりに
PythonパッケージマネージャはPoetry以外にもPipenvもありますし、pipとrequirements.txtで管理するという選択肢もあるかと思います。
今回はPoetryを採用しましたが、どのツールがデファクトスタンダードの座におさまるのか、引き続き注視していきたいと思います。